Logo du tournoi

Logo du tournoi

Avant propos

Avant de commencer, assurez-vous d’avoir téléchargé les fichiers suivants :

et d’avoir installé et chargé les packages :

library(Matrix)
library(lattice)
library('plot.matrix')
library(stringr)

SD Monster, c’est quoi ?

Un SD Monster est un monstre qui possède un certain nombre de caractéristiques :

Dans R, nous avons créé une classe d’objet S4 pour ça. Pour ce faire, vous devez charger le fichier Classe_Monster.R à l’aide de la commande suivante :

source("Classe_Monster.R")

Le but, comme certains jeux de combats, est de laisser deux SD Monsters s’affronter dans un combat. Pour ce faire, voici les caractéristiques :

De plus, chaque SD Monster possède quatre attaques (attack1 jusqu’à attack4) faisant des dégâts en fonction de son type (symbolisé par une lettre) et par les deux types du SD Monster qui se défend (type1 et type2). Pour connaître l’influence des types sur les autres, vous devez charger le fichier suivant :

load("Monster_EMS.Rdata")

Et vous pouvez afficher les influences à l’aide de la commande suivante :

Table_of_type_display(Table_of_type)

Ainsi, une case blanche signifie que l’attaque de la ligne n’a pas d’influence sur le type de la colonne, une case rouge (ou noir) que sa puissance est réduite (voir inutile) et une case verte que l’attaque est plus efficace.

Comment créer un SD Monster ?

Pour créer un SD Monster, vous avez la fonction suivante :

Monstre1<-SD_monster()

qui va simuler toutes les caractéristiques que vous n’avez pas définies. Vous pouvez voir les caractéristique de votre SD monter en l’affichant :

Monstre1
## Monstre Kohyl 
## Type 1 : A et type 2 : H 
## ####################
##  Caractéristiques 
## ####################
## Attaque :          60  - Défense :          60 
## Attaque spéciale : 55  - Défense spéciale : 45 
## Esquive :       43  - Précision : 40 
## Coup critique : 57  - Vitesse :   52 
## Et  380  points de vie 
## ####################
##  Types des attaques 
## ####################
## Attaque 1 : A  - Attaque 2 : I 
## Attaque 3 : C  - Attaque 4 : H

On peut du coup choisir certaines caractéristiques et laisser le reste choisi par tirage au sort :

Monstre2<-SD_monster(name = "Mon monstre",attack = 45,Esquive = 36,Accuracy = 50,type1 = "D",attack3 = "A",HP=68)
Monstre2
## Monstre Mon monstre 
## Type 1 : D et type 2 : B 
## ####################
##  Caractéristiques 
## ####################
## Attaque :          45  - Défense :          27 
## Attaque spéciale : 61  - Défense spéciale : 54 
## Esquive :       36  - Précision : 50 
## Coup critique : 34  - Vitesse :   136 
## Et  68  points de vie 
## ####################
##  Types des attaques 
## ####################
## Attaque 1 : C  - Attaque 2 : B 
## Attaque 3 : A  - Attaque 4 : E

Comment deux SD monsters s’affrontent ?

Les SD monsters s’affrontent entre eux sans intervention. Nous pouvons simplement leur donner quelques indications avec le combat. Pour cela, nous utilisons la fonction Fight. Par exemple, nous avons :

Monstre_gagnant<-Fight(Monstre1,Monstre2)
## #################################
##      Kohyl VS Mon monstre 
## #################################
##  Barre de vie de Kohyl 
##   |                                                                              |======================================================================| 100%
##  Barre de vie de Mon monstre 
##   |                                                                              |======================================================================| 100%
##  Mon monstre attaque
## Barre de vie de Kohyl 
##   |                                                                              |===================================================================   |  96%
##  Kohyl attaque
## Raté 
## Vie de Mon monstre 
## 
##  Mon monstre attaque
## C'est inefficace 
## Barre de vie de Kohyl 
##   |                                                                              |===================================================================   |  95%
##  Kohyl attaque
## C'est très efficace 
## Vie de Mon monstre 
##   |                                                                              |==================================                                    |  49%
##  Mon monstre attaque
## Raté 
## Barre de vie de Kohyl 
## 
##  Kohyl attaque
## Vie de Mon monstre 
##   |                                                                              |==========                                                            |  15%
##  Mon monstre attaque
## Barre de vie de Kohyl 
##   |                                                                              |================================================================      |  91%
##  Kohyl attaque
## Vie de Mon monstre 
##   |                                                                              |                                                                      |   0%
##  Kohyl a gagné
Monstre_gagnant
## Monstre Kohyl 
## Type 1 : A et type 2 : H 
## ####################
##  Caractéristiques 
## ####################
## Attaque :          60  - Défense :          60 
## Attaque spéciale : 55  - Défense spéciale : 45 
## Esquive :       43  - Précision : 40 
## Coup critique : 57  - Vitesse :   52 
## Et  380  points de vie 
## ####################
##  Types des attaques 
## ####################
## Attaque 1 : A  - Attaque 2 : I 
## Attaque 3 : C  - Attaque 4 : H

Ici, c’est le monstre Kohyl qui a gagné. Quelques options permettent de faire varier l’expérience du combat :

Par exemple, la commande suivante permet un combat plus rapide avec moins d’informations :

Fight(Monstre1,Monstre2,display=FALSE,time = 0.1)
## #################################
##      Kohyl VS Mon monstre 
## #################################
##  Evolution Kohyl à gauche et Mon monstre à droite
##   |                                                                              |===========================================================           |  85%  |                                                                              |======================================================================| 100%
##  Kohyl a gagné
## Monstre Kohyl 
## Type 1 : A et type 2 : H 
## ####################
##  Caractéristiques 
## ####################
## Attaque :          60  - Défense :          60 
## Attaque spéciale : 55  - Défense spéciale : 45 
## Esquive :       43  - Précision : 40 
## Coup critique : 57  - Vitesse :   52 
## Et  380  points de vie 
## ####################
##  Types des attaques 
## ####################
## Attaque 1 : A  - Attaque 2 : I 
## Attaque 3 : C  - Attaque 4 : H

Optimisation

Vous êtes libres de choisir comment vous allez décider quel sera le meilleur SD Monster. Si vous choisissez de le faire en utilisant les notions apprises en cours, vous pouvez par exemple adapter ce code qui conserve le dernier SD monster qui a gagné :

###########
# Monstre gagnant
###########
Monster_gagnant<-SD_monster()
for (it in 1:25){
  ##########
  # Nouveau combat
  ##########
  Monster_gagnant<-Fight(Monster_gagnant,SD_monster(),display = FALSE,summary = FALSE,time = 0)
  ##########
  # Affichage pour suivi
  ##########
  cat("Le SD monster gagnant est:",Monster_gagnant@name,"\n")
}
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Suvam 
## Le SD monster gagnant est: Kuxif 
## Le SD monster gagnant est: Kuxif 
## Le SD monster gagnant est: Kuxif 
## Le SD monster gagnant est: Kuxif 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Nahym 
## Le SD monster gagnant est: Xehiz 
## Le SD monster gagnant est: Xehiz 
## Le SD monster gagnant est: Xehiz 
## Le SD monster gagnant est: Xehiz 
## Le SD monster gagnant est: Sivoc

Ici, le dernier SD monster conservé est Sivoc. On peut aussi imaginer de garder les caractéristiques pour les étudier. Pour cela, nous devons stocker les caractéristiques :

##########
# Fonction qui récupère les informations
##########
Stockage<-function(Monster){
  data.frame(name=Monster@name,
             attack=Monster@attack,
             attack_spe=Monster@attack_spe,
             defense=Monster@defense,
             defense_spe=Monster@defense_spe,
             HP=Monster@HP,
             Esquive=Monster@Esquive,
             Critical=Monster@Critical,
             Speed=Monster@Speed,
             Accuracy=Monster@Accuracy,
             type1=Monster@type1@type,
             type2=Monster@type2@type,
             attack1=Monster@attack1@type,
             attack2=Monster@attack2@type,
             attack3=Monster@attack3@type,
             attack4=Monster@attack4@type)
}
Stockage(Monster_gagnant)
##    name attack attack_spe defense defense_spe  HP Esquive Critical Speed
## 1 Sivoc      5         64      92          71 330      68       50    63
##   Accuracy type1 type2 attack1 attack2 attack3 attack4
## 1        4     B     G       F       C       J       G

On peut ainsi simuler plusieurs combats et essayer de voir ce qui fait que quelqu’un gagne ou pas :

############
# Boucle de 25 combats
############
for (it in 1:25){
  #############
  # Monstres
  #############
  Monstre_1<-SD_monster()
  Monstre_2<-SD_monster()
  #############
  # Combat
  #############
  Monstre_gagnant<-Fight(Monster_1 = Monstre_1,Monster_2 = Monstre_2,
                         display = FALSE,summary = FALSE,time = 0)
  #############
  # Stockage
  #############
  temp_1<-Stockage(Monstre_1)
  temp_2<-Stockage(Monstre_2)
  #############
  # Victoire ?
  #############
  temp_1$Victoire<-(Monstre_gagnant@name==Monstre_1@name)
  temp_2$Victoire<-(Monstre_gagnant@name==Monstre_2@name)
  if (it==1){
    Bilan<-rbind(temp_1,temp_2)
  }else{
    Bilan<-rbind(Bilan,temp_1,temp_2)
  }
}
Bilan
##      name attack attack_spe defense defense_spe   HP Esquive Critical Speed
## 1   Kaqaw     58         49      57          37  550      59       41    57
## 2   Tozex     31         20      28          35  560      60       27   101
## 3   Byjuf     73         35      13           2  390      55       71    94
## 4   Jolez     52         36      42          75  540      17       81    80
## 5   Potys     38         70      48          91  850      12       26    17
## 6   Mekyg     28         81      10           3 1070      16       35    84
## 7   Penuh     72         67      34          87  190      48       39     5
## 8   Fuhix     72         63      64          20  620      63        9    11
## 9   Pytuk      8         50      55         113  170       3       78    76
## 10  Zeqap     39         62      29          83  510      41       25    61
## 11  Wijeq     16         28      18          86  890      74       86    29
## 12  Fobog     89         29      57          87  250      66       55    33
## 13  Wucob     58         78      68          17  830      22       42    33
## 14  Nimuw     73         28      21          41  400      26       89    92
## 15  Nipik    115         34     101          11   60       5      100    11
## 16  Cugor     11         87      55          80  170      68       27    89
## 17 Xyquar      3         37      53          78  480      49       92    68
## 18  Fokiq     81         15      40          44  740      57       57     7
## 19  Povej      0         63      39          41  810      36       84    78
## 20  Hysot     42         87      28          20  110      39       58    76
## 21  Vyxes     44         37      77          89  800       3       58    46
## 22  Zuqom     35         57      71          48  600       2       95     9
## 23  Cokok    137         26      25          31   50      12       81     8
## 24  Dynir     45         17      51          67   20      67       27    85
## 25  Vyrug     79         60      88          60   10       5      109    14
## 26  Qydek     55         51     100          46  890      43        1    43
## 27  Riboj     47         85      65          73  200      13       84    37
## 28  Waqec     74          1      53           1  810      94       11    58
## 29  Kalil     34         26      40          76  840      37       54    61
## 30  Wocyn     45         57      65           9  460      67       83    56
## 31  Wuhuc     56         61      46          29  100      65       56    61
## 32 Zaquik     82         29       3          27  680      32       12    94
## 33  Dapej     11         99      11          56  720      30        5    93
## 34  Kecux      5        126      30          81  750      13       69    31
## 35  Paner     34         99      61           2  630      10       73    25
## 36  Mumav     62         66      33          50  270       7       88    62
## 37  Kupoj     27         73      85          12  120      61       82    11
## 38  Vypas    101         29      10          89  490      43       15    64
## 39  Zeliz     14         80      61          50   60      93       44    55
## 40  Vemos     22         14      45          49  610      44       77    73
## 41  Qekuh     16         51       3          42  140      39       82   145
## 42 Hiqual     24         51      30          57  630      64       34    58
## 43  Murit     92          6      90          26  650      11       93    60
## 44  Fogig     79         43      36          15  260      68       70    80
## 45 Cequuh     78         61      67          35  260       2       41    16
## 46  Xawaj    106         60      83          26  220     112        7    19
## 47  Fozym      5         97       9          81  400      87       54    51
## 48  Beqyc     45         63      47          64  670      25       29    59
## 49  Ronet     20         81      10          30  350      80      105    76
## 50  Syxax     43         99      46          49  800      80       25    27
##    Accuracy type1 type2 attack1 attack2 attack3 attack4 Victoire
## 1        37     C     H       B       D       I       F    FALSE
## 2        92     G     E       H       A       B       G     TRUE
## 3        68     E     A       J       D       F       C     TRUE
## 4        13     I     F       I       D       J       E    FALSE
## 5        63     H     C       E       G       A       F     TRUE
## 6        86     G     I       C       F       D       G    FALSE
## 7        79     J     D       I       J       D       F    FALSE
## 8        86     I     A       B       G       H       J     TRUE
## 9        50     A     G       H       I       F       B    FALSE
## 10       59     B     C       D       J       H       A     TRUE
## 11       24     I     B       H       A       D       G     TRUE
## 12        9     C     A       H       F       J       G    FALSE
## 13       49     A     G       E       D       H       J     TRUE
## 14       40     E     F       G       J       C       E    FALSE
## 15       67     C     B       A       F       G       B    FALSE
## 16       16     E     B       A       F       G       C     TRUE
## 17       22     J     F       A       E       F       D    FALSE
## 18       75     F     J       B       C       J       G     TRUE
## 19       28     F     I       J       D       B       E    FALSE
## 20       89     I     G       F       H       C       D     TRUE
## 21       16     E     A       J       H       I       G     TRUE
## 22       73     J     D       C       B       A       J    FALSE
## 23      125     J     E       G       I       E       F     TRUE
## 24       89     D     G       C       I       E       H    FALSE
## 25       34     I     F       F       H       A       D    FALSE
## 26       22     J     G       H       F       A       D     TRUE
## 27       26     I     F       B       H       F       A    FALSE
## 28       77     F     H       F       H       B       A     TRUE
## 29       38     H     D       H       C       D       F    FALSE
## 30       22     H     J       J       B       F       E     TRUE
## 31       66     I     F       I       J       E       D    FALSE
## 32      103     G     D       H       G       F       J     TRUE
## 33       73     I     D       D       J       E       G     TRUE
## 34       20     H     B       A       B       E       G    FALSE
## 35       83     I     D       A       C       G       E     TRUE
## 36       55     B     A       J       C       B       E    FALSE
## 37       87     I     E       D       I       A       G    FALSE
## 38       50     D     A       D       G       A       I     TRUE
## 39       47     G     E       I       J       A       D    FALSE
## 40       65     H     D       I       G       H       F     TRUE
## 41       58     F     I       D       B       E       G    FALSE
## 42       69     F     J       H       I       J       B     TRUE
## 43        7     H     G       G       D       F       C    FALSE
## 44       33     J     A       G       C       A       D     TRUE
## 45      124     A     G       J       I       F       H     TRUE
## 46       15     H     E       H       F       J       E    FALSE
## 47       26     E     J       D       C       H       F    FALSE
## 48       51     G     F       H       D       C       E     TRUE
## 49       13     J     B       E       J       H       F    FALSE
## 50        1     I     C       G       C       B       F     TRUE

Nous pouvons alors analyser les caractéristiques par exemple avec un arbre aléatoire :

library(rpart)
library(rpart.plot)
########
# CART
########
Arbre<-rpart(Victoire~.,data = Bilan[,-1])
########
# Affichage
########
rpart.plot(Arbre)

Ou encore une forêt aléatoire :

library(randomForest)
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
############
# Random Forest
############
Bilan$Victoire<-as.factor(Bilan$Victoire)
Foret<-randomForest(Victoire~.,data = Bilan[,-1],ntree = 1000)
############
# Importance
############
############
# Affichage
############
varImpPlot(Foret,main = "Importance des caractéristiques")

Tournoi

Pour le tournoi, vous devez sélectionner le SD monster qui vous paraîtra le plus puissant et le sauvegarder avec la commande suivante :

Monster_Nom<-Monstre_gagnant
save("Monster_Nom",file="[nom].Rdata")

Nous ferons un tournoi où, suivant un tirage au sort, les SD monsters vont s’affronter deux à deux sur 5 manches. Le SD_monster qui aura gagné au moins trois manches passera au niveau suivant jusqu’à la finale. Vous aurez le droit de préciser les probabilités de chaque attaque avant chaque combat. Bon tournoi.